﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;

namespace MusicDatabase
{
    public enum DataMode
    {
        toevoegen,
        wijzigen,
        verwijderen,
        raadplegen,
    }

    /*
     * Auteur:  F.Bour
     * Datum:   7-12-2012
     * Omschrijving:    
     *          Deze classe communiceert met de daadwerkelijke database.
     *          Concreet betekent dit dat alle SQL-statements uitgevoerd worden.
     *          Daartoe heb je nodig een "DbConnection" en een "DbAdapter".
     *          Aangezien we nu gebruik maken van een SQL-server compact zijn ze 
     *          van het type "Ole"
     * 
     */
    public class SQLServices
    {
        private string connectionString = @"Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;" + @"Data Source=|DataDirectory|\Music.sdf";
        private OleDbConnection connection;
        private DataTable table;

        public SQLServices()
        {
            connection = new OleDbConnection(connectionString);
        }

        /// <summary>
        /// Methode die nagaat of een "Command" een of meer records in een tabel vindt.
        /// 
        /// Voor een select query is de initialisatie van de OleDbDataAdapter afwijkend tov. 
        /// INSERT, DELETE of UPDATE. 
        /// 
        /// Deze sluit ook zelf de connection.
        /// </summary>
        /// <param name="tabelnaam"> naam van de tabel, die geraadpleegd wordt. </param>
        /// <param name="command"> het "SELECT * FROM" command  </param>
        /// <returns></returns>
        public bool Exist(string command)
        {
            table = new DataTable();

            OleDbDataAdapter adapter = new OleDbDataAdapter(command, connectionString);
            table.Clear();
            int recordCount = adapter.Fill(table);

            return recordCount != 0;
        }

        public void Insert(string command)
        {
            OleDbCommand insertCommand = new OleDbCommand();
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            connection.Open();

            try
            {
                // put the command in the adapter
                insertCommand.Connection = connection;
                insertCommand.CommandText = command;
                adapter.InsertCommand = insertCommand;

                // do the insert
                adapter.InsertCommand.ExecuteNonQuery();
            }
            finally
            {
                connection.Close();
            }
        }

        public void Update(string command)
        {
            OleDbCommand updateCommand = new OleDbCommand();
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            connection.Open();

            // put the command in the adapter
            updateCommand.CommandText = command;
            updateCommand.Connection = connection;
            adapter.UpdateCommand = updateCommand;

            // do the update
            adapter.UpdateCommand.ExecuteNonQuery();
            connection.Close();
        }

        public void Delete(string command)
        {
            OleDbCommand deleteCommand = new OleDbCommand();
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            connection.Open();

            // put the command in the adapter
            deleteCommand.CommandText = command;
            deleteCommand.Connection = connection;
            adapter.DeleteCommand = deleteCommand;

            // do the delete
            adapter.DeleteCommand.ExecuteNonQuery();
            connection.Close();
        }

        /// <summary>
        /// Deze methode haalt van een specifiek veld de veldwaarde op in het 
        /// 0de (dus eerste record in de resultset).
        /// Belangrijk is wel dat het record aan de hand van de primaire sleutel opgehaald is.
        /// </summary>
        /// <param name="veldnaam">De naam van het veld in de tabel.</param>
        /// <returns>Veldwaarde als string</returns>
        public string GetVeldValue(string veldnaam)
        {
            return table.Rows[0][veldnaam].ToString();
        }


        /// <summary>
        /// Haalt de gegevens op uit een tabel. Er moet een volledig "SELECT"-statement
        /// aangeboden worden.
        /// </summary>
        /// <param name="command">SELECT - commando</param>
        /// <returns>kolomnamen (0-de rij) én alle records (eerste t/m laatste rij)</returns>
        public List<string[]> GetTable(string command)
        {
            table = new DataTable();

            OleDbDataAdapter adapter = new OleDbDataAdapter(command, connectionString);
            table.Clear();
            adapter.Fill(table);


            // copieert de content naar de aanroeper...
            // eerst de veldnamen . . .
            List<string[]> content = new List<string[]>();
            string[] veldnamen = new string[table.Columns.Count];
            for (int i = 0; i < table.Columns.Count; i++)
            {
                veldnamen[i] = table.Columns[i].ColumnName;
            }
            content.Add(veldnamen);
            // . . . daarna de veldwaarden
            string[] rij;
            for (int i = 0; i < table.Rows.Count; i++)
            {
                rij = new string[table.Columns.Count];
                for (int j = 0; j < table.Columns.Count; j++)
                {
                    rij[j] = table.Rows[i][j].ToString();
                }
                content.Add(rij);
            }
            return content;
        }

        public DataTable GetDataTable(string command)
        {
            table = new DataTable();

            OleDbDataAdapter adapter = new OleDbDataAdapter(command, connectionString);
            table.Clear();
            adapter.Fill(table);

            return table;
        }
    }
}
